gdk: Make DRAG_ENTER event take x/y coordinates
authorBenjamin Otte <otte@redhat.com>
Wed, 19 Feb 2020 02:37:23 +0000 (03:37 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 21 Feb 2020 17:19:16 +0000 (18:19 +0100)
Make it mirror the behavior of ENTER/LEAVE events.

gdk/gdkdrop.c
gdk/gdkdropprivate.h
gdk/wayland/gdkdevice-wayland.c
gdk/win32/gdkdrop-win32.c
gdk/x11/gdkdrop-x11.c
gtk/gtkdragdest.c
gtk/gtkmain.c

index 6d40b79d93fd5c0a4aa8d200933fe547f2b45d92..b491eebfdb641fb1db98c47bf6d97040ff56e6b0 100644 (file)
@@ -962,6 +962,8 @@ gdk_drop_do_emit_event (GdkEvent *event,
 void
 gdk_drop_emit_enter_event (GdkDrop  *self,
                            gboolean  dont_queue,
+                           double    x,
+                           double    y,
                            guint32   time)
 {
   GdkDropPrivate *priv = gdk_drop_get_instance_private (self);
index 5836c89b78edc3d8769fd25d1484ec3e6b4fb840..82b5e4194588a84ef8d6c28c64c7b292e979a19a 100644 (file)
@@ -61,6 +61,8 @@ void                    gdk_drop_set_actions                    (GdkDrop
 
 void                    gdk_drop_emit_enter_event               (GdkDrop                *self,
                                                                  gboolean                dont_queue,
+                                                                 double                  x,
+                                                                 double                  y,
                                                                  guint32                 time);
 void                    gdk_drop_emit_motion_event              (GdkDrop                *self,
                                                                  gboolean                dont_queue,
index b16cfffb972293cdae8e3346ab7d257e42111618..26c99684d62c44bfb8c58744bfd8cec9f123a471 100644 (file)
@@ -1201,6 +1201,7 @@ data_device_enter (void                  *data,
   GdkWaylandSeat *seat = data;
   GdkSurface *dest_surface;
   GdkContentFormats *formats;
+  int origin_x, origin_y;
   GdkDevice *device;
 
   dest_surface = wl_surface_get_user_data (surface);
@@ -1245,8 +1246,12 @@ data_device_enter (void                  *data,
 
   gdk_wayland_seat_discard_pending_offer (seat);
 
+  gdk_surface_get_origin (gdk_drop_get_surface (seat->drop), &origin_x, &origin_y);
+
   gdk_drop_emit_enter_event (seat->drop,
                              FALSE,
+                             origin_x + seat->pointer_info.surface_x,
+                             origin_y + seat->pointer_info.surface_y,
                              GDK_CURRENT_TIME);
 }
 
index 6ad661544207424178db76ac239c762387ada18b..3bcb92b89ba552bb9799ff88741e217d58fa3e79 100644 (file)
@@ -487,8 +487,7 @@ _gdk_win32_local_drop_target_dragenter (GdkDrag        *drag,
 
   source_actions = set_source_actions_helper (drop, *actions, grfKeyState);
 
-  gdk_drop_emit_enter_event (drop, TRUE, time_);
-  gdk_drop_emit_motion_event (drop, TRUE, x_root, y_root, time_);
+  gdk_drop_emit_enter_event (drop, TRUE, x_root, y_root, time_);
   drop_win32->last_key_state = grfKeyState;
   drop_win32->last_x = x_root;
   drop_win32->last_y = y_root;
@@ -559,8 +558,7 @@ idroptarget_dragenter (LPDROPTARGET This,
   set_data_object (&ctx->data_object, pDataObj);
   pt_x = pt.x / drop_win32->scale + _gdk_offset_x;
   pt_y = pt.y / drop_win32->scale + _gdk_offset_y;
-  gdk_drop_emit_enter_event (drop, TRUE, GDK_CURRENT_TIME);
-  gdk_drop_emit_motion_event (drop, TRUE, pt_x, pt_y, GDK_CURRENT_TIME);
+  gdk_drop_emit_enter_event (drop, TRUE, pt_x, pt_y, GDK_CURRENT_TIME);
   drop_win32->last_key_state = grfKeyState;
   drop_win32->last_x = pt_x;
   drop_win32->last_y = pt_y;
index 4eb24d154f2562199e3e4b015ff1e75dfc539904..767adac7ab6c1404bd601b05b992a80c3711778c 100644 (file)
@@ -70,6 +70,7 @@ struct _GdkX11Drop
 
   guint xdnd_targets_set  : 1; /* Whether we've already set XdndTypeList */
   guint xdnd_have_actions : 1; /* Whether an XdndActionList was provided */
+  guint enter_emitted     : 1; /* Set after gdk_drop_emit_enter() */
 };
 
 struct _GdkX11DropClass
@@ -582,8 +583,6 @@ xdnd_enter_filter (GdkSurface   *surface,
 
   display_x11->current_drop = drop;
 
-  gdk_drop_emit_enter_event (drop, FALSE, GDK_CURRENT_TIME);
-
   gdk_content_formats_unref (content_formats);
 
   return TRUE;
@@ -609,7 +608,8 @@ xdnd_leave_filter (GdkSurface   *surface,
   if ((display_x11->current_drop != NULL) &&
       (GDK_X11_DROP (display_x11->current_drop)->source_window == source_window))
     {
-      gdk_drop_emit_leave_event (display_x11->current_drop, FALSE, GDK_CURRENT_TIME);
+      if (GDK_X11_DROP (display_x11->current_drop)->enter_emitted)
+        gdk_drop_emit_leave_event (display_x11->current_drop, FALSE, GDK_CURRENT_TIME);
 
       g_clear_object (&display_x11->current_drop);
     }
@@ -656,7 +656,15 @@ xdnd_position_filter (GdkSurface   *surface,
       drop_x11->last_x = x_root / impl->surface_scale;
       drop_x11->last_y = y_root / impl->surface_scale;
 
-      gdk_drop_emit_motion_event (drop, FALSE, drop_x11->last_x - surface->x, drop_x11->last_y - surface->y, time);
+      if (drop_x11->enter_emitted)
+        {
+          gdk_drop_emit_motion_event (drop, FALSE, drop_x11->last_x - surface->x, drop_x11->last_y - surface->y, time);
+        }
+      else
+        {
+          gdk_drop_emit_enter_event (drop, FALSE, drop_x11->last_x - surface->x, drop_x11->last_y - surface->y, time);
+          drop_x11->enter_emitted = TRUE;
+        }
     }
 
   return TRUE;
index 51dcf37c9634e6663fb70b5742087a7cdd8a7c08..8742dc6e8ad4c2bcfcb60b8b31727052e9f21145 100644 (file)
@@ -822,13 +822,11 @@ gtk_drag_dest_handle_event (GtkWidget *toplevel,
 
   switch ((guint) event_type)
     {
-    case GDK_DRAG_ENTER:
-      break;
-
     case GDK_DRAG_LEAVE:
       gtk_drop_set_current_dest (drop, NULL);
       break;
 
+    case GDK_DRAG_ENTER:
     case GDK_DRAG_MOTION:
     case GDK_DROP_START:
       gtk_drop_set_current_dest (drop, NULL);
index 8ca682925fea5b604ee784f66ad7e77110c7d75e..20b232c5f6469e73273f99c47a5b386d156eae06 100644 (file)
@@ -1812,13 +1812,13 @@ gtk_main_do_event (GdkEvent *event)
       /* Crossing event propagation happens during picking */
       break;
 
+    case GDK_DRAG_ENTER:
     case GDK_DRAG_MOTION:
     case GDK_DROP_START:
       if (gtk_propagate_event (target_widget, event))
         break;
       G_GNUC_FALLTHROUGH;
 
-    case GDK_DRAG_ENTER:
     case GDK_DRAG_LEAVE:
       gtk_drag_dest_handle_event (target_widget, event);
       break;